package com.huangsm.juc.lock;

/**
 * 判断打印"1"还是"2"
 *
 *  1.两个普通同步方法，两个线程标准打印，打印?//1 2
 *  2.新增Thread.sleep()给getOne()，打印//1,2
 *  3.新增普通方法getThree(),打印//3 1 2
 *  4.两个普通的同步方法，俩个Test1对象，打印//2 1
 *  5.修改getOne()为静态同步方法，打印//2 1
 *  6.修改两个方法均为静态同步方法，一个Test对象// 1 2
 *  7.一个静态同步方法，一个同步方法，两个Test1对象// 2 1
 *  8.两个静态同步方法，两个Test1对象// 1 2
 *
 *  线程八锁的关键:
 *  ①非静态方法的锁默认为:this,静态方法的锁对应的Class实例
 *  ②某一个时刻内，只能有一个线程持有锁，无论几个方法
 */
public class LockTest {
    public static void main(String[] args) {
        Test1 test1=new Test1();
        Test1 test2=new Test1();
        new Thread(()->{
            Test1.getOne();
        }).start();
        new Thread(()->{
            Test1.getTwo();
        }).start();
       /* new Thread(()->{
            test1.getThree();
        }).start();*/
    }
}
class Test1{
    public static synchronized void getOne(){
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("1");
    }
    public static synchronized void getTwo(){
        System.out.println("2");
    }

    public void getThree(){
        System.out.println("3");
    }
}
